<?php

/*
 * Copyright (C) 2010 Emanuele Colonnelli <emanuele.colonnelli@phpstruct.org>
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

namespace org\phpstruct\core\exceptions;

/**
 * Description of StructException
 *
 * @author Emanuele Colonnelli <emanuele.colonnelli@phpstruct.org>
 */
class StructException extends \Exception {

    protected  $code;
    protected  $message;
    private $format;
    private $exception;

    function __construct($message, $code, $exception=null) {
        $this->code = $code;
        $this->message = $message;
        $this->exception = $exception;
    }

    public function setCode($code) {
        $this->code = $code;
    }

    public function setMessage($message) {
        $this->message = $message;
    }

    public function getFormat() {
        return $this->format;
    }

    public function setFormat($format) {
        $this->format = $format;
    }

    public function __toString() {

        $out = "";

        $out.= "[ERROR][CODE] {$this->code}\r\n";

        if (is_array($this->message)) {
            foreach ($this->message as $msg) {
                $out .= "[ " . implode(',', $this->message) . " ]\r\n";
            }
        } else {
            $out .= "[{$this->message}]\r\n";
        }
        if ($this->exception instanceof \Exception) {
            $out.= "[ERROR][STACKTRACE]{$this->exception->getTraceAsString()}\r\n";
        }

        switch ($this->format) {
            case 'JSON':
                return \json_encode($this);
                break;
            default:
                return $out;
                break;
        }
    }

}

